package com.zhuxiaomei.service;

import com.zhuxiaomei.dto.restaurant.*;
import com.zhuxiaomei.vo.restaurant.RestaurantCategoryVO;
import com.zhuxiaomei.vo.restaurant.RestaurantDishVO;
import com.zhuxiaomei.vo.restaurant.RestaurantOrderVO;

import java.util.List;
import java.util.Map;

/**
 * @author hxm
 * @date 2024/11/10 15:44
 * @description
 */
public interface RestaurantService {

    /**
     * 获取所有在售菜品类别
     * @return
     */
    List<RestaurantCategoryVO> getCategoriesByStatus(String status);

    /**
     * 获取所有在售菜品信息
     * @return
     */
    List<RestaurantDishVO> getRestaurantDishesByStatus(String status);

    /**
     * 根据id修改菜品状态
     * @param restaurantDishesStatusDTOList
     * @return
     */
    Integer putChangeDishesStatus(List<RestaurantDishesStatusDTO> restaurantDishesStatusDTOList);

    /**
     * 获取所有菜品列别
     * @return
     */
    List<RestaurantCategoryVO> getAllCategories();

    /**
     * 餐厅新增菜品
     * @param restaurantDishDTO
     * @return
     */
    Integer postAddDish(RestaurantDishDTO restaurantDishDTO);

    /**
     * 根据id获取菜品信息
     * @param id
     * @return
     */
    RestaurantDishVO getRestaurantDishById(Long id);

    /**
     * 修改猪小妹餐厅的菜品信息
     * @param restaurantDishDTO
     * @return
     */
    Integer putEditDish(RestaurantDishDTO restaurantDishDTO);

    /**
     * 根据id删除猪小妹餐厅的菜品
     * @param id
     * @return
     */
    Integer deleteRestaurantDishById(Long id);

    /**
     * 猪小妹餐厅新增菜品类别
     * @param restaurantCategoryDTO
     * @return
     */
    Integer postAddCategory(RestaurantCategoryDTO restaurantCategoryDTO);

    /**
     * 获取猪小妹餐厅的所有类别，包括其类别下的所有以上下架菜品
     * @return
     */
    Map<String, List<RestaurantDishVO>> getCategoryAndDishes(Byte status);

    /**
     * 根据菜品类别名称查询类别下是否有在售菜品，返回在售菜品id
     * @param categoryName
     * @return
     */
    List<Long> getDishOnSaleByCategoryName(String categoryName);


    /**
     * 根据status改变菜品类别状态，同时改变该类别下的dish的status。
     * @param status
     * @param restaurantCategoryAndDishIdsDTOList
     * @return
     */
    Boolean changeCategoryAndDishesStatus(Byte status, List<RestaurantCategoryAndDishIdsDTO> restaurantCategoryAndDishIdsDTOList);

    /**
     * 根据菜品类别名称查询类别下是否有未在售菜品，返回在售菜品id
     * @param categoryName
     * @return
     */
    List<Long> getDishOnNoSaleByCategoryName(String categoryName);

    /**
     * 根据菜品类别名获取菜品信息
     * @param categoryName
     * @return
     */
    RestaurantCategoryVO getRestaurantCatetoryInfoByCategoryName(String categoryName);

    /**
     * 更新菜品类别信息
     * @param restaurantCategoryDTO
     * @return
     */
    Integer putRestaurantCategory(RestaurantCategoryDTO restaurantCategoryDTO);

    /**
     * 根据菜品类别名删除菜品类别
     * @param categoryName
     * @return
     */
    Integer deleteCategoryByName(String categoryName);

    /**
     * 新增订单
     * @param restaurantOrderDTOList
     * @return 订单编号
     */
    String newOrder(List<RestaurantOrderDTO> restaurantOrderDTOList);

    /**
     * 根据订单号获取订单信息
     * @param orderNo
     * @return
     */
    RestaurantOrderVO getRestaurantOrderInfoByOrderNo(String orderNo);

    /**
     * 根据订单状态获取当前用户与对象用户的所有订单
     * @param status
     * @return
     */
    List<RestaurantOrderVO> getRestaurantOrderInfo(Integer status);

    /**
     * 修改订单信息
     * @param restaurantOrderVO
     */
    void editRestaurantOrder(RestaurantOrderVO restaurantOrderVO);
}
